package com.gitee.lambda.cart;

import com.gitee.lambda.cart.predicate.SkuPredicate;

import java.util.ArrayList;
import java.util.List;

/**
 * @author gcq
 * @Create 2022-06-22
 */
public class CartService {

    // 加入到购物车中的商品信息
    private static List<Sku> cartSkuList =
            new ArrayList<Sku>() {
                {
                    add(new Sku(654032, "无人机",
                            4999.00, 1,
                            4999.00, SkuCategoryEnum.ELECTRONICS));

                    add(new Sku(642934, "VR一体机",
                            2299.00, 1,
                            2299.00, SkuCategoryEnum.ELECTRONICS));

                    add(new Sku(645321, "纯色衬衫",
                            409.00, 3,
                            1227.00, SkuCategoryEnum.CLOTHING));

                    add(new Sku(654327, "牛仔裤",
                            528.00, 1,
                            528.00, SkuCategoryEnum.CLOTHING));

                    add(new Sku(675489, "跑步机",
                            2699.00, 1,
                            2699.00, SkuCategoryEnum.SPORTS));

                    add(new Sku(644564, "Java编程思想",
                            79.80, 1,
                            79.80, SkuCategoryEnum.BOOKS));

                    add(new Sku(678678, "Java核心技术",
                            149.00, 1,
                            149.00, SkuCategoryEnum.BOOKS));

                    add(new Sku(697894, "算法",
                            78.20, 1,
                            78.20, SkuCategoryEnum.BOOKS));

                    add(new Sku(696968, "TensorFlow进阶指南",
                            85.10, 1,
                            85.10, SkuCategoryEnum.BOOKS));
                }
            };

    public static List<Sku> getCartSkuList() {
        return cartSkuList;
    }

    /**
     * version1.0.0
     * 找出购物车中所有电子产品
     *
     * @param cartSkuList
     * @return
     */
    public static List<Sku> filterElectronicsSkus(List<Sku> cartSkuList) {
        List<Sku> result = new ArrayList<>();
        for (Sku sku : cartSkuList) {
            // 如果商品类型 等于 电子类
            if(SkuCategoryEnum.ELECTRONICS.equals(sku.getSkuCategory())) {
                result.add(sku);
            }
        }
        return result;
    }

    /**
     * Version2.0.0
     * 根据传入商品参数，找出购物车中同种商品类型的商品列表
     *
     * @param skuList
     * @param skuCategoryEnum 传入的指定类型
     * @return
     */
    public static List<Sku> filterSkusByCategory(List<Sku> skuList, SkuCategoryEnum skuCategoryEnum) {
        List<Sku> result = new ArrayList<>();
        for (Sku sku : skuList) {
            // 如果商品类型 等于 电子类
            if(skuCategoryEnum.equals(sku.getSkuCategory())) {
                result.add(sku);
            }
        }
        return result;
    }


    /**
     * Version3.0.0
     * 支持通过商品类型和总价来过滤商品
     *
     * @param skuList
     * @param skuCategoryEnum
     * @param totalPrice
     * @param categoryOrPrice true 根据商品类型 false 根据商品价格
     * @return
     */
    public static List<Sku> filterSkus(List<Sku> skuList, SkuCategoryEnum skuCategoryEnum,
                                       Double totalPrice, Boolean categoryOrPrice) {
        List<Sku> result = new ArrayList<>();
        for (Sku sku : skuList) {
            if(
                    (categoryOrPrice && skuCategoryEnum.equals(sku.getSkuCategory()))
                    ||
                    (!categoryOrPrice && sku.getTotalPrice() > totalPrice)) {
                    result.add(sku);
            }
        }
        return result;
    }
    /**
     * 更高层级进行抽象
     * 解决问题无非就是根据 sku 返回一个 true 或者 false
     * =================================================================================================================
     */

    /**
     * Version4.0.0
     * 根据不同的Sku判断标准，对Sku列表进行过滤
     *
     * @param skuList
     * @param skuPredicate
     * @return
     */
    public static List<Sku> filterSkus(List<Sku> skuList, SkuPredicate skuPredicate) {
        List<Sku> result = new ArrayList<>();
        for (Sku sku : skuList) {
            if(skuPredicate.test(sku)) {
                result.add(sku);
            }
        }
        return result;
    }
}